{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/facebookresearch/esm/blob/master/examples/variant_prediction.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Supervised variant prediction with ESM\n",
    "\n",
    "**Note, this example notebook predates our work on zero-shot variant prediction, which is presented in `examples/variant-prediction`**.\n",
    "\n",
    "This tutorial demonstrates how to train a simple variant predictor, i.e. we predict the biological activity of mutations of a protein, using fixed embeddings from ESM. You can adopt a similar protocol to train a model for any downstream task, even with limited data.\n",
    "\n",
    "We will use a simple classifier in sklearn (or \"head\" on top of the transformer features) to predict the mutation effect from precomputed ESM embeddings. The embeddings for your dataset can be dumped once using a GPU. Then, the rest of your analysis can be done on CPU. \n",
    "\n",
    "### Background\n",
    "\n",
    "In this particular example, we will train a model to predict the activity of ß-lactamase variants.\n",
    "\n",
    "We provide the training in `examples/data/P62593.fasta`, a FASTA file where each entry contains:\n",
    "- the mutated ß-lactamase sequence, where a single residue is mutated (swapped with another amino acid)\n",
    "- the target value in the last field of the header, describing the scaled effect of the mutation\n",
    "\n",
    "The [data originally comes](https://github.com/FowlerLab/Envision2017/blob/master/data/dmsTraining_2017-02-20.csv) from a deep mutational scan and was released with the Envision paper (Gray, et al. 2018)\n",
    "\n",
    "### Goals\n",
    "- Obtain an embedding (fixed-dimensional vector representation) for each mutated sequence.\n",
    "- Train a regression model in sklearn that can predict the \"effect\" score given the embedding.\n",
    "\n",
    "\n",
    "### Prerequisites\n",
    "- You will need the following modules : tqdm, matplotlib, numpy, pandas, seaborn, scipy, scikit-learn\n",
    "- You have obtained sequence embeddings for ß-lactamase as described in the README:\n",
    "```\n",
    "python scripts/extract.py esm1v_t33_650M_UR90S_1 examples/data/P62593.fasta examples/data/P62593_emb_esm1v/ --repr_layers 33 --include mean\n",
    "```\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Table of Contents\n",
    "1. [Prelims](#prelims)\n",
    "1. [Loading Embeddings](#load_embeddings)\n",
    "1. [Visualizing Embeddings](#viz_embeddings)\n",
    "1. [Initializing / Running Grid Search](#grid_search)\n",
    "1. [Browse Grid Search Results](#browse)\n",
    "1. [Evaluating Results](#eval)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='prelims'></a>\n",
    "## Prelims"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If you are using colab, then uncomment and run the cell below.\n",
    "It will pip install the `esm` code, fetch the fasta file and the pre-computed embeddings."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# !pip install git+https://github.com/facebookresearch/esm.git\n",
    "# !curl -O https://dl.fbaipublicfiles.com/fair-esm/examples/P62593_reprs.tar.gz\n",
    "# !tar -xzf P62593_reprs.tar.gz\n",
    "# !curl -O https://dl.fbaipublicfiles.com/fair-esm/examples/P62593.fasta\n",
    "# !pwd\n",
    "# !ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "from collections import Counter\n",
    "from tqdm import tqdm\n",
    "\n",
    "import torch\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "import esm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import scipy\n",
    "from sklearn.model_selection import GridSearchCV, train_test_split\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor\n",
    "from sklearn.svm import SVC, SVR\n",
    "from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor\n",
    "from sklearn.naive_bayes import GaussianNB\n",
    "from sklearn.linear_model import LogisticRegression, SGDRegressor\n",
    "from sklearn.pipeline import Pipeline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Add the path to your embeddings here:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "FASTA_PATH = \"./data/P62593.fasta\" # Path to P62593.fasta\n",
    "EMB_PATH = \"./data/P62593_emb_esm1v/\" # Path to directory of embeddings for P62593.fasta\n",
    "EMB_LAYER = 33"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='load_embeddings'></a>\n",
    "## Load embeddings (Xs) and target effects (ys)\n",
    "Our FASTA file is formatted as such:\n",
    "```\n",
    ">{index}|{mutation_id}|{effect}\n",
    "{seq}\n",
    "```\n",
    "We will be extracting the effect from each entry.\n",
    "\n",
    "Our embeddings are stored with the file name from fasta header: `{index}|{mutation_id}|{effect}.pt`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5397\n",
      "(5397, 1280)\n"
     ]
    }
   ],
   "source": [
    "ys = []\n",
    "Xs = []\n",
    "for header, _seq in esm.data.read_fasta(FASTA_PATH):\n",
    "    scaled_effect = header.split('|')[-1]\n",
    "    ys.append(float(scaled_effect))\n",
    "    fn = f'{EMB_PATH}/{header[1:]}.pt'\n",
    "    embs = torch.load(fn)\n",
    "    Xs.append(embs['mean_representations'][EMB_LAYER])\n",
    "Xs = torch.stack(Xs, dim=0).numpy()\n",
    "print(len(ys))\n",
    "print(Xs.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train / Test Split\n",
    "\n",
    "Here we choose to follow the Envision paper, using 80% of the data for training, but we actually found that pre-trained ESM embeddings require fewer downstream training examples to reach the same level of performance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_size = 0.8\n",
    "Xs_train, Xs_test, ys_train, ys_test = train_test_split(Xs, ys, train_size=train_size, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((4317, 1280), (1080, 1280), 4317, 1080)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Xs_train.shape, Xs_test.shape, len(ys_train), len(ys_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PCA\n",
    "\n",
    "Principal Component Analysis is a popular technique for dimensionality reduction. Given `n_features` (1280 in our case), PCA computes a new set of `X` that \"best explain the data.\" We've found that this enables downstream models to be trained faster with minimal loss in performance.  \n",
    "\n",
    "Here, we set `X` to 60, but feel free to change it!\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_pca_components = 60\n",
    "pca = PCA(num_pca_components)\n",
    "Xs_train_pca = pca.fit_transform(Xs_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='viz_embeddings'></a>\n",
    "## Visualize Embeddings\n",
    "\n",
    "Here, we plot the first two principal components on the x- and y- axes. Each point is then colored by its scaled effect (what we want to predict).\n",
    "\n",
    "Visually, we can see a separation based on color/effect, suggesting that our representations are useful for this task, without any task-specific training!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.colorbar.Colorbar at 0x7f04a5d3c790>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig_dims = (7, 6)\n",
    "fig, ax = plt.subplots(figsize=fig_dims)\n",
    "sc = ax.scatter(Xs_train_pca[:,0], Xs_train_pca[:,1], c=ys_train, marker='.')\n",
    "ax.set_xlabel('PCA first principal component')\n",
    "ax.set_ylabel('PCA second principal component')\n",
    "plt.colorbar(sc, label='Variant Effect')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='grid_search'></a>\n",
    "\n",
    "## Initialize / Run GridSearch\n",
    "\n",
    "We will run grid search for three different regression models:\n",
    "1. [K-nearest-neighbors](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsRegressor.html)\n",
    "2. [SVM](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html?highlight=svr#sklearn.svm.SVR)\n",
    "3. [Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html?highlight=randomforestregressor#sklearn.ensemble.RandomForestRegressor)\n",
    "\n",
    "Here, we will be using the PCA-projected features because we observe it does just as well as `Xs` while allowing for faster training. You can easily swap it out for `Xs`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Initialize grids for different regression techniques"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_grid = [\n",
    "    {\n",
    "        'model': [KNeighborsRegressor()],\n",
    "        'model__n_neighbors': [5, 10],\n",
    "        'model__weights': ['uniform', 'distance'],\n",
    "        'model__algorithm': ['ball_tree', 'kd_tree', 'brute'],\n",
    "        'model__leaf_size' : [15, 30],\n",
    "        'model__p' : [1, 2],\n",
    "    }\n",
    "    ]\n",
    "\n",
    "svm_grid = [\n",
    "    {\n",
    "        'model': [SVR()],\n",
    "        'model__C' : [0.1, 1.0, 10.0],\n",
    "        'model__kernel' : ['linear', 'poly', 'rbf', 'sigmoid'],\n",
    "        'model__degree' : [3],\n",
    "        'model__gamma': ['scale'],\n",
    "    }\n",
    "]\n",
    "\n",
    "rfr_grid = [\n",
    "    {\n",
    "        'model': [RandomForestRegressor()],\n",
    "        'model__n_estimators' : [20],\n",
    "        'model__criterion' : ['squared_error', 'absolute_error'],\n",
    "        'model__max_features': ['sqrt', 'log2'],\n",
    "        'model__min_samples_split' : [5, 10],\n",
    "        'model__min_samples_leaf': [1, 4]\n",
    "    }\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "cls_list = [KNeighborsRegressor, SVR, RandomForestRegressor]\n",
    "param_grid_list = [knn_grid, svm_grid, rfr_grid]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Run Grid Search \n",
    "\n",
    "(will take a few minutes on a single core)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'sklearn.neighbors._regression.KNeighborsRegressor'>\n",
      "Fitting 5 folds for each of 48 candidates, totalling 240 fits\n",
      "<class 'sklearn.svm._classes.SVR'>\n",
      "Fitting 5 folds for each of 12 candidates, totalling 60 fits\n",
      "<class 'sklearn.ensemble._forest.RandomForestRegressor'>\n",
      "Fitting 5 folds for each of 16 candidates, totalling 80 fits\n"
     ]
    }
   ],
   "source": [
    "# make sure data preprocessing (PCA here) is run inside CV to avoid data leakage\n",
    "pipe = Pipeline(\n",
    "    steps = (\n",
    "        ('pca', PCA(num_pca_components)),\n",
    "        ('model', 'passthrough')\n",
    "    )\n",
    ")\n",
    "\n",
    "result_list = []\n",
    "grid_list = []\n",
    "for cls_name, param_grid in zip(cls_list, param_grid_list):\n",
    "    print(cls_name)\n",
    "    grid = GridSearchCV(\n",
    "        estimator = pipe,\n",
    "        param_grid = param_grid,\n",
    "        scoring = 'r2',\n",
    "        verbose = 1,\n",
    "        n_jobs = -1 # use all available cores\n",
    "    )\n",
    "    grid.fit(Xs_train, ys_train)\n",
    "    result_list.append(pd.DataFrame.from_dict(grid.cv_results_))\n",
    "    grid_list.append(grid)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='browse'></a>\n",
    "## Browse the Sweep Results\n",
    "\n",
    "The following tables show the top 5 parameter settings, based on `mean_test_score`. Given our setup, this should really be thought of as `validation_score`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### K Nearest Neighbors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mean_fit_time</th>\n",
       "      <th>std_fit_time</th>\n",
       "      <th>mean_score_time</th>\n",
       "      <th>std_score_time</th>\n",
       "      <th>param_model</th>\n",
       "      <th>param_model__algorithm</th>\n",
       "      <th>param_model__leaf_size</th>\n",
       "      <th>param_model__n_neighbors</th>\n",
       "      <th>param_model__p</th>\n",
       "      <th>param_model__weights</th>\n",
       "      <th>params</th>\n",
       "      <th>split0_test_score</th>\n",
       "      <th>split1_test_score</th>\n",
       "      <th>split2_test_score</th>\n",
       "      <th>split3_test_score</th>\n",
       "      <th>split4_test_score</th>\n",
       "      <th>mean_test_score</th>\n",
       "      <th>std_test_score</th>\n",
       "      <th>rank_test_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>1.861867</td>\n",
       "      <td>0.283238</td>\n",
       "      <td>0.816056</td>\n",
       "      <td>0.063010</td>\n",
       "      <td>KNeighborsRegressor(algorithm='ball_tree', p=1...</td>\n",
       "      <td>ball_tree</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>distance</td>\n",
       "      <td>{'model': KNeighborsRegressor(algorithm='ball_...</td>\n",
       "      <td>0.695010</td>\n",
       "      <td>0.705608</td>\n",
       "      <td>0.657999</td>\n",
       "      <td>0.644695</td>\n",
       "      <td>0.665164</td>\n",
       "      <td>0.673695</td>\n",
       "      <td>0.022947</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.765102</td>\n",
       "      <td>0.207029</td>\n",
       "      <td>0.689800</td>\n",
       "      <td>0.216780</td>\n",
       "      <td>KNeighborsRegressor(algorithm='ball_tree', p=1...</td>\n",
       "      <td>ball_tree</td>\n",
       "      <td>15</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>distance</td>\n",
       "      <td>{'model': KNeighborsRegressor(algorithm='ball_...</td>\n",
       "      <td>0.690265</td>\n",
       "      <td>0.701557</td>\n",
       "      <td>0.661057</td>\n",
       "      <td>0.649508</td>\n",
       "      <td>0.665427</td>\n",
       "      <td>0.673563</td>\n",
       "      <td>0.019307</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>0.589193</td>\n",
       "      <td>0.099892</td>\n",
       "      <td>1.422166</td>\n",
       "      <td>0.152255</td>\n",
       "      <td>KNeighborsRegressor(algorithm='ball_tree', p=1...</td>\n",
       "      <td>kd_tree</td>\n",
       "      <td>15</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>distance</td>\n",
       "      <td>{'model': KNeighborsRegressor(algorithm='ball_...</td>\n",
       "      <td>0.693205</td>\n",
       "      <td>0.700961</td>\n",
       "      <td>0.663998</td>\n",
       "      <td>0.648063</td>\n",
       "      <td>0.659884</td>\n",
       "      <td>0.673222</td>\n",
       "      <td>0.020321</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>1.284200</td>\n",
       "      <td>0.496219</td>\n",
       "      <td>1.202915</td>\n",
       "      <td>0.300557</td>\n",
       "      <td>KNeighborsRegressor(algorithm='ball_tree', p=1...</td>\n",
       "      <td>brute</td>\n",
       "      <td>15</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>distance</td>\n",
       "      <td>{'model': KNeighborsRegressor(algorithm='ball_...</td>\n",
       "      <td>0.692801</td>\n",
       "      <td>0.698600</td>\n",
       "      <td>0.661247</td>\n",
       "      <td>0.649249</td>\n",
       "      <td>0.660964</td>\n",
       "      <td>0.672572</td>\n",
       "      <td>0.019461</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>1.363155</td>\n",
       "      <td>0.416416</td>\n",
       "      <td>0.370380</td>\n",
       "      <td>0.174864</td>\n",
       "      <td>KNeighborsRegressor(algorithm='ball_tree', p=1...</td>\n",
       "      <td>brute</td>\n",
       "      <td>30</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>distance</td>\n",
       "      <td>{'model': KNeighborsRegressor(algorithm='ball_...</td>\n",
       "      <td>0.695918</td>\n",
       "      <td>0.701295</td>\n",
       "      <td>0.655434</td>\n",
       "      <td>0.641803</td>\n",
       "      <td>0.661102</td>\n",
       "      <td>0.671110</td>\n",
       "      <td>0.023372</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    mean_fit_time  std_fit_time  mean_score_time  std_score_time  \\\n",
       "9        1.861867      0.283238         0.816056        0.063010   \n",
       "1        1.765102      0.207029         0.689800        0.216780   \n",
       "17       0.589193      0.099892         1.422166        0.152255   \n",
       "33       1.284200      0.496219         1.202915        0.300557   \n",
       "41       1.363155      0.416416         0.370380        0.174864   \n",
       "\n",
       "                                          param_model param_model__algorithm  \\\n",
       "9   KNeighborsRegressor(algorithm='ball_tree', p=1...              ball_tree   \n",
       "1   KNeighborsRegressor(algorithm='ball_tree', p=1...              ball_tree   \n",
       "17  KNeighborsRegressor(algorithm='ball_tree', p=1...                kd_tree   \n",
       "33  KNeighborsRegressor(algorithm='ball_tree', p=1...                  brute   \n",
       "41  KNeighborsRegressor(algorithm='ball_tree', p=1...                  brute   \n",
       "\n",
       "   param_model__leaf_size param_model__n_neighbors param_model__p  \\\n",
       "9                      30                        5              1   \n",
       "1                      15                        5              1   \n",
       "17                     15                        5              1   \n",
       "33                     15                        5              1   \n",
       "41                     30                        5              1   \n",
       "\n",
       "   param_model__weights                                             params  \\\n",
       "9              distance  {'model': KNeighborsRegressor(algorithm='ball_...   \n",
       "1              distance  {'model': KNeighborsRegressor(algorithm='ball_...   \n",
       "17             distance  {'model': KNeighborsRegressor(algorithm='ball_...   \n",
       "33             distance  {'model': KNeighborsRegressor(algorithm='ball_...   \n",
       "41             distance  {'model': KNeighborsRegressor(algorithm='ball_...   \n",
       "\n",
       "    split0_test_score  split1_test_score  split2_test_score  \\\n",
       "9            0.695010           0.705608           0.657999   \n",
       "1            0.690265           0.701557           0.661057   \n",
       "17           0.693205           0.700961           0.663998   \n",
       "33           0.692801           0.698600           0.661247   \n",
       "41           0.695918           0.701295           0.655434   \n",
       "\n",
       "    split3_test_score  split4_test_score  mean_test_score  std_test_score  \\\n",
       "9            0.644695           0.665164         0.673695        0.022947   \n",
       "1            0.649508           0.665427         0.673563        0.019307   \n",
       "17           0.648063           0.659884         0.673222        0.020321   \n",
       "33           0.649249           0.660964         0.672572        0.019461   \n",
       "41           0.641803           0.661102         0.671110        0.023372   \n",
       "\n",
       "    rank_test_score  \n",
       "9                 1  \n",
       "1                 2  \n",
       "17                3  \n",
       "33                4  \n",
       "41                5  "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result_list[0].sort_values('rank_test_score')[:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mean_fit_time</th>\n",
       "      <th>std_fit_time</th>\n",
       "      <th>mean_score_time</th>\n",
       "      <th>std_score_time</th>\n",
       "      <th>param_model</th>\n",
       "      <th>param_model__C</th>\n",
       "      <th>param_model__degree</th>\n",
       "      <th>param_model__gamma</th>\n",
       "      <th>param_model__kernel</th>\n",
       "      <th>params</th>\n",
       "      <th>split0_test_score</th>\n",
       "      <th>split1_test_score</th>\n",
       "      <th>split2_test_score</th>\n",
       "      <th>split3_test_score</th>\n",
       "      <th>split4_test_score</th>\n",
       "      <th>mean_test_score</th>\n",
       "      <th>std_test_score</th>\n",
       "      <th>rank_test_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1.596057</td>\n",
       "      <td>0.374811</td>\n",
       "      <td>0.187232</td>\n",
       "      <td>0.012077</td>\n",
       "      <td>SVR()</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3</td>\n",
       "      <td>scale</td>\n",
       "      <td>rbf</td>\n",
       "      <td>{'model': SVR(), 'model__C': 1.0, 'model__degr...</td>\n",
       "      <td>0.737071</td>\n",
       "      <td>0.726406</td>\n",
       "      <td>0.678442</td>\n",
       "      <td>0.702208</td>\n",
       "      <td>0.689338</td>\n",
       "      <td>0.706693</td>\n",
       "      <td>0.022049</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>2.030772</td>\n",
       "      <td>0.278808</td>\n",
       "      <td>0.183248</td>\n",
       "      <td>0.008195</td>\n",
       "      <td>SVR()</td>\n",
       "      <td>10.0</td>\n",
       "      <td>3</td>\n",
       "      <td>scale</td>\n",
       "      <td>rbf</td>\n",
       "      <td>{'model': SVR(), 'model__C': 10.0, 'model__deg...</td>\n",
       "      <td>0.701482</td>\n",
       "      <td>0.713377</td>\n",
       "      <td>0.671624</td>\n",
       "      <td>0.691004</td>\n",
       "      <td>0.681054</td>\n",
       "      <td>0.691708</td>\n",
       "      <td>0.014714</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.559752</td>\n",
       "      <td>0.208916</td>\n",
       "      <td>0.218885</td>\n",
       "      <td>0.045596</td>\n",
       "      <td>SVR()</td>\n",
       "      <td>0.1</td>\n",
       "      <td>3</td>\n",
       "      <td>scale</td>\n",
       "      <td>rbf</td>\n",
       "      <td>{'model': SVR(), 'model__C': 0.1, 'model__degr...</td>\n",
       "      <td>0.643568</td>\n",
       "      <td>0.621554</td>\n",
       "      <td>0.574986</td>\n",
       "      <td>0.610664</td>\n",
       "      <td>0.578071</td>\n",
       "      <td>0.605769</td>\n",
       "      <td>0.026141</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2.062963</td>\n",
       "      <td>0.209779</td>\n",
       "      <td>0.078716</td>\n",
       "      <td>0.004191</td>\n",
       "      <td>SVR()</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3</td>\n",
       "      <td>scale</td>\n",
       "      <td>poly</td>\n",
       "      <td>{'model': SVR(), 'model__C': 1.0, 'model__degr...</td>\n",
       "      <td>0.523832</td>\n",
       "      <td>0.425124</td>\n",
       "      <td>0.448338</td>\n",
       "      <td>0.476281</td>\n",
       "      <td>0.418398</td>\n",
       "      <td>0.458395</td>\n",
       "      <td>0.038496</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1.457202</td>\n",
       "      <td>0.369496</td>\n",
       "      <td>0.079903</td>\n",
       "      <td>0.004191</td>\n",
       "      <td>SVR()</td>\n",
       "      <td>10.0</td>\n",
       "      <td>3</td>\n",
       "      <td>scale</td>\n",
       "      <td>linear</td>\n",
       "      <td>{'model': SVR(), 'model__C': 10.0, 'model__deg...</td>\n",
       "      <td>0.484858</td>\n",
       "      <td>0.446688</td>\n",
       "      <td>0.434547</td>\n",
       "      <td>0.442608</td>\n",
       "      <td>0.432603</td>\n",
       "      <td>0.448261</td>\n",
       "      <td>0.019011</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    mean_fit_time  std_fit_time  mean_score_time  std_score_time param_model  \\\n",
       "6        1.596057      0.374811         0.187232        0.012077       SVR()   \n",
       "10       2.030772      0.278808         0.183248        0.008195       SVR()   \n",
       "2        1.559752      0.208916         0.218885        0.045596       SVR()   \n",
       "5        2.062963      0.209779         0.078716        0.004191       SVR()   \n",
       "8        1.457202      0.369496         0.079903        0.004191       SVR()   \n",
       "\n",
       "   param_model__C param_model__degree param_model__gamma param_model__kernel  \\\n",
       "6             1.0                   3              scale                 rbf   \n",
       "10           10.0                   3              scale                 rbf   \n",
       "2             0.1                   3              scale                 rbf   \n",
       "5             1.0                   3              scale                poly   \n",
       "8            10.0                   3              scale              linear   \n",
       "\n",
       "                                               params  split0_test_score  \\\n",
       "6   {'model': SVR(), 'model__C': 1.0, 'model__degr...           0.737071   \n",
       "10  {'model': SVR(), 'model__C': 10.0, 'model__deg...           0.701482   \n",
       "2   {'model': SVR(), 'model__C': 0.1, 'model__degr...           0.643568   \n",
       "5   {'model': SVR(), 'model__C': 1.0, 'model__degr...           0.523832   \n",
       "8   {'model': SVR(), 'model__C': 10.0, 'model__deg...           0.484858   \n",
       "\n",
       "    split1_test_score  split2_test_score  split3_test_score  \\\n",
       "6            0.726406           0.678442           0.702208   \n",
       "10           0.713377           0.671624           0.691004   \n",
       "2            0.621554           0.574986           0.610664   \n",
       "5            0.425124           0.448338           0.476281   \n",
       "8            0.446688           0.434547           0.442608   \n",
       "\n",
       "    split4_test_score  mean_test_score  std_test_score  rank_test_score  \n",
       "6            0.689338         0.706693        0.022049                1  \n",
       "10           0.681054         0.691708        0.014714                2  \n",
       "2            0.578071         0.605769        0.026141                3  \n",
       "5            0.418398         0.458395        0.038496                4  \n",
       "8            0.432603         0.448261        0.019011                5  "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result_list[1].sort_values('rank_test_score')[:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Random Forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mean_fit_time</th>\n",
       "      <th>std_fit_time</th>\n",
       "      <th>mean_score_time</th>\n",
       "      <th>std_score_time</th>\n",
       "      <th>param_model</th>\n",
       "      <th>param_model__criterion</th>\n",
       "      <th>param_model__max_features</th>\n",
       "      <th>param_model__min_samples_leaf</th>\n",
       "      <th>param_model__min_samples_split</th>\n",
       "      <th>param_model__n_estimators</th>\n",
       "      <th>params</th>\n",
       "      <th>split0_test_score</th>\n",
       "      <th>split1_test_score</th>\n",
       "      <th>split2_test_score</th>\n",
       "      <th>split3_test_score</th>\n",
       "      <th>split4_test_score</th>\n",
       "      <th>mean_test_score</th>\n",
       "      <th>std_test_score</th>\n",
       "      <th>rank_test_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.185552</td>\n",
       "      <td>0.132015</td>\n",
       "      <td>0.015165</td>\n",
       "      <td>0.000395</td>\n",
       "      <td>RandomForestRegressor(max_features='log2', min...</td>\n",
       "      <td>squared_error</td>\n",
       "      <td>log2</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>20</td>\n",
       "      <td>{'model': RandomForestRegressor(max_features='...</td>\n",
       "      <td>0.533933</td>\n",
       "      <td>0.530109</td>\n",
       "      <td>0.503419</td>\n",
       "      <td>0.519353</td>\n",
       "      <td>0.467033</td>\n",
       "      <td>0.510769</td>\n",
       "      <td>0.024295</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.334341</td>\n",
       "      <td>0.110625</td>\n",
       "      <td>0.012710</td>\n",
       "      <td>0.001579</td>\n",
       "      <td>RandomForestRegressor(max_features='log2', min...</td>\n",
       "      <td>squared_error</td>\n",
       "      <td>sqrt</td>\n",
       "      <td>1</td>\n",
       "      <td>10</td>\n",
       "      <td>20</td>\n",
       "      <td>{'model': RandomForestRegressor(max_features='...</td>\n",
       "      <td>0.539230</td>\n",
       "      <td>0.510809</td>\n",
       "      <td>0.481912</td>\n",
       "      <td>0.528806</td>\n",
       "      <td>0.479765</td>\n",
       "      <td>0.508105</td>\n",
       "      <td>0.024058</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.445742</td>\n",
       "      <td>0.118084</td>\n",
       "      <td>0.013353</td>\n",
       "      <td>0.001643</td>\n",
       "      <td>RandomForestRegressor(max_features='log2', min...</td>\n",
       "      <td>squared_error</td>\n",
       "      <td>sqrt</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>20</td>\n",
       "      <td>{'model': RandomForestRegressor(max_features='...</td>\n",
       "      <td>0.530501</td>\n",
       "      <td>0.514021</td>\n",
       "      <td>0.491199</td>\n",
       "      <td>0.516743</td>\n",
       "      <td>0.487662</td>\n",
       "      <td>0.508025</td>\n",
       "      <td>0.016217</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.495729</td>\n",
       "      <td>0.124626</td>\n",
       "      <td>0.010826</td>\n",
       "      <td>0.000706</td>\n",
       "      <td>RandomForestRegressor(max_features='log2', min...</td>\n",
       "      <td>squared_error</td>\n",
       "      <td>sqrt</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>20</td>\n",
       "      <td>{'model': RandomForestRegressor(max_features='...</td>\n",
       "      <td>0.514546</td>\n",
       "      <td>0.533379</td>\n",
       "      <td>0.479104</td>\n",
       "      <td>0.518605</td>\n",
       "      <td>0.459918</td>\n",
       "      <td>0.501110</td>\n",
       "      <td>0.027236</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>12.151597</td>\n",
       "      <td>1.092783</td>\n",
       "      <td>0.010862</td>\n",
       "      <td>0.001263</td>\n",
       "      <td>RandomForestRegressor(max_features='log2', min...</td>\n",
       "      <td>absolute_error</td>\n",
       "      <td>sqrt</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>20</td>\n",
       "      <td>{'model': RandomForestRegressor(max_features='...</td>\n",
       "      <td>0.505719</td>\n",
       "      <td>0.502644</td>\n",
       "      <td>0.470106</td>\n",
       "      <td>0.511916</td>\n",
       "      <td>0.468395</td>\n",
       "      <td>0.491756</td>\n",
       "      <td>0.018625</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   mean_fit_time  std_fit_time  mean_score_time  std_score_time  \\\n",
       "4       1.185552      0.132015         0.015165        0.000395   \n",
       "1       1.334341      0.110625         0.012710        0.001579   \n",
       "0       1.445742      0.118084         0.013353        0.001643   \n",
       "2       1.495729      0.124626         0.010826        0.000706   \n",
       "8      12.151597      1.092783         0.010862        0.001263   \n",
       "\n",
       "                                         param_model param_model__criterion  \\\n",
       "4  RandomForestRegressor(max_features='log2', min...          squared_error   \n",
       "1  RandomForestRegressor(max_features='log2', min...          squared_error   \n",
       "0  RandomForestRegressor(max_features='log2', min...          squared_error   \n",
       "2  RandomForestRegressor(max_features='log2', min...          squared_error   \n",
       "8  RandomForestRegressor(max_features='log2', min...         absolute_error   \n",
       "\n",
       "  param_model__max_features param_model__min_samples_leaf  \\\n",
       "4                      log2                             1   \n",
       "1                      sqrt                             1   \n",
       "0                      sqrt                             1   \n",
       "2                      sqrt                             4   \n",
       "8                      sqrt                             1   \n",
       "\n",
       "  param_model__min_samples_split param_model__n_estimators  \\\n",
       "4                              5                        20   \n",
       "1                             10                        20   \n",
       "0                              5                        20   \n",
       "2                              5                        20   \n",
       "8                              5                        20   \n",
       "\n",
       "                                              params  split0_test_score  \\\n",
       "4  {'model': RandomForestRegressor(max_features='...           0.533933   \n",
       "1  {'model': RandomForestRegressor(max_features='...           0.539230   \n",
       "0  {'model': RandomForestRegressor(max_features='...           0.530501   \n",
       "2  {'model': RandomForestRegressor(max_features='...           0.514546   \n",
       "8  {'model': RandomForestRegressor(max_features='...           0.505719   \n",
       "\n",
       "   split1_test_score  split2_test_score  split3_test_score  split4_test_score  \\\n",
       "4           0.530109           0.503419           0.519353           0.467033   \n",
       "1           0.510809           0.481912           0.528806           0.479765   \n",
       "0           0.514021           0.491199           0.516743           0.487662   \n",
       "2           0.533379           0.479104           0.518605           0.459918   \n",
       "8           0.502644           0.470106           0.511916           0.468395   \n",
       "\n",
       "   mean_test_score  std_test_score  rank_test_score  \n",
       "4         0.510769        0.024295                1  \n",
       "1         0.508105        0.024058                2  \n",
       "0         0.508025        0.016217                3  \n",
       "2         0.501110        0.027236                4  \n",
       "8         0.491756        0.018625                5  "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result_list[2].sort_values('rank_test_score')[:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id='eval'></a>\n",
    "## Evaluation\n",
    "\n",
    "Now that we have run grid search, each `grid` object contains a `best_estimator_`.\n",
    "\n",
    "We can use this to evaluate the correlation between our predictions and the true effect scores on the held-out validation set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "KNeighborsRegressor(algorithm='ball_tree', p=1, weights='distance')\n",
      "\n",
      "SpearmanrResult(correlation=0.8065398315270731, pvalue=2.4681127050485095e-248)\n",
      "\n",
      " -------------------------------------------------------------------------------- \n",
      "\n",
      "SVR()\n",
      "\n",
      "SpearmanrResult(correlation=0.8147793655720186, pvalue=1.8403540985305893e-257)\n",
      "\n",
      " -------------------------------------------------------------------------------- \n",
      "\n",
      "RandomForestRegressor(max_features='log2', min_samples_split=5, n_estimators=20)\n",
      "\n",
      "SpearmanrResult(correlation=0.7277072328713822, pvalue=1.0094601306397444e-178)\n",
      "\n",
      " -------------------------------------------------------------------------------- \n",
      "\n"
     ]
    }
   ],
   "source": [
    "for grid in grid_list:\n",
    "    print(grid.best_estimator_.get_params()[\"steps\"][1][1]) # get the model details from the estimator\n",
    "    print()\n",
    "    preds = grid.predict(Xs_test)\n",
    "    print(f'{scipy.stats.spearmanr(ys_test, preds)}')\n",
    "    print('\\n', '-' * 80, '\\n')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The SVM performs the best on the `test` set, with a spearman rho of 0.815! \n",
    "\n",
    "This is in line with our grid-search results, where it also had the best `validation` performance.\n",
    "\n",
    "In conclusion, our downstream model was able to use fixed pre-trained ESM embedding representations and obtain a decent result.\n",
    "\n",
    "For reference, we report correlation of 0.89 in Table 7 of [Rives et al.](https://www.biorxiv.org/content/10.1101/622803v3), but this was achieved by fine-tuning the model, and with ESM-1, before we developed ESM-1v."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**For zero-shot variant prediction, see `examples/variant-prediction`**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
